// 当一个函数声明时 ，如果TypeScript 可以确定如何调用它，该函数的参数会自动被赋予类型，所以没必要去再给形参加类型注释

const names = ["Alice", "Bob", "Eve"];
 
// Contextual typing for function
names.forEach(function (s) {
  console.log(s.toUpperCase());
});   //  (local function)(s: string): void

names.forEach((s) => {
  console.log(s.toUpperCase());
});  //   function(s: string): void  

// 这里的匿名函数在声明的时候，形参是没有给到类型定义的，但是它作为forEach方法的回调函数，ts已经知道在forEach方法内部会怎么调用它、会传什么值给它，所以这里的形参就会被ts自动推断类型是string，

// 通过这种方式，推断出来的函数形参的类型，称为上下文类型，因为函数发生的上下文告知它应该具有什么类型

//你不需要懂得，它是怎么通过函数执行的上下文，推理出参数类型的，你需要知道什么时候函数的参数的类型会被推理出来，这样你就明白什么时候可以，不给函数参数写类型注释

// 总结一下，function声明的匿名函数，在声明时ts都知道会怎么调用，所以都能帮你推断出参数类型，根本就不需要你去手动设置类型注释